namespace Nice157Advices.Advices
{
    /// <summary>
    /// 61.避免在finally内撰写无效代码
    /// </summary>
    public static class _61
    {
        /**
         * 在CLR中，方法的参数及返回值都是用栈来保存的。在方法内部，会首先将参数依次压栈，当需要使用这些参数的时候，方法会直接去栈里取用参数值，方法返回时，会将返回值压入栈顶。如果参数的类型是值类型，压栈的就是复制的值；如果是引用类型，则在方法内对于参数的修改也会带到方法外。
         */

        public static void Go ()
        {
            int test1 = Test1 ();
            System.Console.WriteLine (test1);

            int test2 = Test2 ();
            System.Console.WriteLine (test2);

            var p = Test3 ();
            System.Console.WriteLine (p.Name);
        }

        private static int Test1 ()
        {
            int i;
            try
            {
                i = 1;
            }
            finally
            {
                i = 2;
                System.Console.WriteLine ("\t 将int结果改为2,finally执行完毕");
            }
            return i;
        }

        private static int Test2 ()
        {
            int i;
            try
            {
                i = 1;
                return i;
            }
            finally
            {
                i = 2; // 无效代码
                System.Console.WriteLine ("\t 将int结果改为2,finally执行完毕");
            }
        }

        private static Person Test3 ()
        {
            var p = new Person { Name = "capdiem", Age = 24 };
            try
            {
                return p;
            }
            finally
            {
                p.Name = "tomato";
                System.Console.WriteLine ("\t 将p.name修改为fox");
            }
        }

        private class Person
        {
            public string Name { get; set; }
            public int Age { get; set; }
        }
    }
}